// 音乐控制器 - 处理音乐相关的业务逻辑

const path = require('path');
const fs = require('fs').promises;
const fsSync = require('fs');
const multer = require('multer');

// 音乐文件存储路径 - 支持从环境变量覆盖
const MUSIC_DIR = process.env.MUSIC_DIR || path.join(__dirname, '..', '..', 'music');
console.log('MusicController使用的音乐目录:', MUSIC_DIR);

// 配置multer存储
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        // 从文件名提取艺术家和歌曲名信息
        let folderName = file.originalname;
        // 移除文件扩展名
        const extIndex = folderName.lastIndexOf('.');
        if (extIndex > 0) {
            folderName = folderName.substring(0, extIndex);
        }
        
        // 创建音乐文件存储目录
        const musicDir = path.join(MUSIC_DIR, folderName);
        
        // 确保目录存在
        if (!fsSync.existsSync(musicDir)) {
            fsSync.mkdirSync(musicDir, { recursive: true });
        }
        
        cb(null, musicDir);
    },
    filename: (req, file, cb) => {
        // 使用原始文件名存储
        cb(null, file.originalname);
    }
});

// 创建multer实例
const upload = multer({
    storage: storage,
    limits: {
        fileSize: 100 * 1024 * 1024 // 限制文件大小为100MB
    },
    fileFilter: (req, file, cb) => {
        // 只允许上传音频文件
        const ext = path.extname(file.originalname).toLowerCase();
        const supportedFormats = ['.mp3', '.flac', '.wav', '.m4a', '.aac', '.ogg', '.wma', '.aiff', '.aif', '.alac', '.mp4'];
        if (supportedFormats.includes(ext)) {
            return cb(null, true);
        }
        cb(new Error('只支持常见音频格式：MP3、FLAC、WAV、M4A、AAC、OGG、WMA、AIFF、ALAC、MP4'));
    }
});

// 获取所有音乐列表
async function getAllMusic(req, res) {
    try {
        const musicList = await getMusicList();
        res.json(musicList);
    } catch (error) {
        console.error('获取音乐列表失败:', error);
        res.status(500).json({ error: '获取音乐列表失败' });
    }
}

// 搜索音乐
async function searchMusic(req, res) {
    try {
        const query = req.query.q || '';
        const musicList = await getMusicList();
        
        const results = musicList.filter(music => {
            return music.title.toLowerCase().includes(query.toLowerCase()) ||
                   music.artist.toLowerCase().includes(query.toLowerCase());
        });
        
        res.json(results);
    } catch (error) {
        console.error('搜索音乐失败:', error);
        res.status(500).json({ error: '搜索音乐失败' });
    }
}

// 获取单个音乐详情
async function getMusicById(req, res) {
    try {
        const id = parseInt(req.params.id);
        const musicList = await getMusicList();
        
        const music = musicList.find(item => item.id === id);
        if (!music) {
            return res.status(404).json({ error: '音乐不存在' });
        }
        
        res.json(music);
    } catch (error) {
        console.error('获取音乐详情失败:', error);
        res.status(500).json({ error: '获取音乐详情失败' });
    }
}

// 从文件系统获取音乐列表
async function getMusicList() {
    try {
        // 检查音乐目录是否存在
        if (!fsSync.existsSync(MUSIC_DIR)) {
            console.warn('音乐目录不存在，返回空数据');
            return [];
        }
        
        // 读取音乐目录
        const folders = await fs.readdir(MUSIC_DIR, { withFileTypes: true });
        const musicFolders = folders.filter(dirent => dirent.isDirectory());
        
        // 如果没有音乐文件夹，返回空数据
        if (musicFolders.length === 0) {
            console.warn('音乐目录为空，返回空数据');
            return [];
        }
        
        // 处理每个音乐文件夹
        const musicList = [];
        let id = 1;
        
        for (const folder of musicFolders) {
            const folderPath = path.join(MUSIC_DIR, folder.name);
            const files = await fs.readdir(folderPath);
            
            // 查找音频文件、封面和歌词 - 支持多种音频格式
            const audioFile = files.find(file => {
                const extension = file.toLowerCase().split('.').pop();
                return ['mp3', 'flac', 'wav', 'm4a', 'aac', 'ogg', 'wma', 'aiff', 'aif', 'alac', 'mp4'].includes(extension);
            });
            const coverFile = files.find(file => 
                file.toLowerCase().includes('cover') && 
                (file.toLowerCase().endsWith('.jpg') || 
                 file.toLowerCase().endsWith('.jpeg') || 
                 file.toLowerCase().endsWith('.png'))
            );
            // 查找歌词文件 - 支持.lrc和.txt扩展名，不需要文件名包含特定字符串
            const lyricsFile = files.find(file => 
                file.toLowerCase().endsWith('.lrc') || 
                file.toLowerCase().endsWith('.txt')
            );
            
            // 如果有音频文件，添加到音乐列表
            if (audioFile) {
                // 尝试从文件夹名中提取艺术家和歌曲名
                // 格式假设为：艺术家 - 歌曲名 或 歌曲名
                let title = folder.name;
                let artist = '';
                
                // 检查是否包含分隔符
                const separatorIndex = folder.name.indexOf(' - ');
                if (separatorIndex > 0) {
                    artist = folder.name.substring(0, separatorIndex).trim();
                    title = folder.name.substring(separatorIndex + 3).trim();
                } else {
                    // 如果没有明确的艺术家信息，设置为空字符串
                    artist = '';
                }
                
                musicList.push({
                    id: id++,
                    title: title,
                    artist: artist,
                    audioUrl: `/music/${folder.name}/${audioFile}`,
                    coverUrl: coverFile ? `/music/${folder.name}/${coverFile}` : null,
                    lyricsUrl: lyricsFile ? `/music/${folder.name}/${lyricsFile}` : null
                });
            }
        }
        
        return musicList;
    } catch (error) {
        console.error('读取音乐列表失败:', error);
        // 出错时返回空数据
        return [];
    }
}

// 上传音乐文件
async function uploadMusic(req, res) {
    try {
        // 使用multer中间件处理多文件上传
        upload.array('files')(req, res, async (err) => {
            if (err) {
                console.error('文件上传错误:', err);
                return res.status(400).json({
                    error: err.message || '文件上传失败'
                });
            }
            
            // 确保有文件被上传
            if (!req.files || req.files.length === 0) {
                return res.status(400).json({
                    error: '没有文件被上传'
                });
            }
            
            // 处理上传成功的文件
            const uploadedFiles = req.files.map(file => ({
                filename: file.originalname,
                path: file.path,
                size: file.size
            }));
            
            console.log('成功上传文件:', uploadedFiles.length, '个');
            
            // 响应成功信息
            res.json({
                success: true,
                message: `成功上传 ${uploadedFiles.length} 个文件`,
                files: uploadedFiles
            });
        });
    } catch (error) {
        console.error('上传音乐文件失败:', error);
        res.status(500).json({ error: '上传音乐文件失败' });
    }
}

// 导出控制器函数
module.exports = {
    getAllMusic,
    searchMusic,
    getMusicById,
    uploadMusic
};